package com.cskaoyan.service;

import com.cskaoyan.bean.BO.AdminCouponBO;
import com.cskaoyan.bean.PO.MarketCoupon;
import com.cskaoyan.bean.PO.MarketCouponExample;
import com.cskaoyan.bean.PO.MarketCouponUser;
import com.cskaoyan.bean.PO.MarketCouponUserExample;
import com.cskaoyan.bean.common.BasePageInfo;
import com.cskaoyan.bean.common.CommonData;
import com.cskaoyan.mapper.MarketCouponMapper;
import com.cskaoyan.mapper.MarketCouponUserMapper;
import com.cskaoyan.utils.GenerateCDK;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * @author wenkaikai
 * @since 2022/08/13 17:15
 */
@Service
@Transactional
public class AdminCouponServiceImpl implements AdminCouponService {

    @Autowired
    MarketCouponMapper marketCouponMapper;

    @Autowired
    MarketCouponUserMapper marketCouponUserMapper;

    /**
     * 优惠券列表
     *
     * @param info
     * @param name   优惠券名字
     * @param type   优惠券类型 0 ：通用优惠券
     *               1：注册赠券
     *               2： 对换码
     * @param status 优惠券状态： 0 ：正常
     *               1： 已过期
     *               2： 已下架
     * @return
     */
    @Override
    public CommonData<MarketCoupon> queryCouponList(BasePageInfo info, String name, Short type, Short status) {
        MarketCouponExample example = new MarketCouponExample();
        // 都不为空，拼接上order by 条件
        if (info.getSort() != null && info.getOrder() != null) {
            example.setOrderByClause(info.getSort() + " " + info.getOrder());
        }
        MarketCouponExample.Criteria criteria = example.createCriteria();
        // 不为空，拼接上查询条件
        if (name != null && !"".equals(name)) {
            criteria.andNameLike("%" + name + "%");
        }
        if (type != null) {
            criteria.andTypeEqualTo(type);
        }
        if (status != null) {
            criteria.andStatusEqualTo(status);
        }
        // 查询前开启分页
        PageHelper.startPage(info.getPage(), info.getLimit());
        List<MarketCoupon> marketCoupons = marketCouponMapper.selectByExample(example);
        // 查询结果交给分页工具处理
        PageInfo<MarketCoupon> marketCouponPageInfo = new PageInfo<>(marketCoupons);
        CommonData data = CommonData.data(marketCouponPageInfo);
        return data;

    }

    /**
     * 要在对应的类上加上四个参数
     * addtime，updatetime
     * 如果type = 2 说明是兑换码，要生成对换码放进code参数
     * id 直接 insert的时候取回
     * deleted 设置为0
     *
     * @param marketCoupon
     * @return
     */
    @Override
    public AdminCouponBO insertCoupon(AdminCouponBO marketCoupon) {
        Date date = new Date();
        marketCoupon.setAddTime(date);
        marketCoupon.setUpdateTime(date);
        marketCoupon.setDeleted(false);
        if (marketCoupon.getType().intValue() == 2) {
            // 优惠券类型是对换码时
            String randomCDK = GenerateCDK.getRandomCDK();
            marketCoupon.setCode(randomCDK);
        }
        int code = marketCouponMapper.insertSelective2(marketCoupon);
        if (code == 1) {
            return marketCoupon;
        }
        // 插入失败
        return null;
    }

    /**
     * 编辑优惠券
     * 直接覆盖源内容
     * update 更新一下，前端传的时间有问题
     *
     * @param
     * @return
     */
    @Override
    public MarketCoupon updateCoupon(MarketCoupon marketCoupon) {
        marketCoupon.setUpdateTime(new Date());
        int code = marketCouponMapper.updateByPrimaryKey(marketCoupon);
        if (code == 1) {
            return marketCoupon;
        }
        return null;
    }

    /**
     * 删除券，逻辑删除，把deleted设置为true
     * update时间更新
     * status状态改为 下架 2
     * @param marketCoupon
     * @return
     */
    @Override
    public int deleteCoupon(MarketCoupon marketCoupon) {
        // 通过id改这几个地方
        MarketCoupon coupon = new MarketCoupon();
        coupon.setId(marketCoupon.getId());
        coupon.setUpdateTime(new Date());
        coupon.setDeleted(true);
        coupon.setStatus((short) 2);
        int code = marketCouponMapper.updateByPrimaryKeySelective(coupon);
        return code;
    }

    /**
     * 回显优惠券详情
     * @param id
     * @return
     */
    @Override
    public MarketCoupon queryCouponById(Integer id) {
        MarketCoupon coupon = marketCouponMapper.selectByPrimaryKey(id);
        return coupon;
    }

    /**
     * 优惠券 用户领取情况和使用情况回显。
     * 按领取时间倒序排 ,其中addTime就是领取时间
     * @param info   列表显示相关
     * @param couponId   用来查询此优惠券被用户 持有的列表
     * @param userId     根据用户id查询
     * @param status     根据使用状态查询，但是前端 把 2 和 3 搞反了。显示相反了，这里不做处理
     *                   0则未使用；
     *                   如果是1则已使用；
     *                   如果是2则已过期；
     *                   如果是3则已经下架；
     * @return
     */
    @Override
    public CommonData<MarketCouponUser> queryCouponUserList(BasePageInfo info, Integer couponId, Integer userId, Short status) {

        MarketCouponUserExample example = new MarketCouponUserExample();
        // 都不为空，拼接上order by 条件
        if (info.getSort() != null && info.getOrder() != null) {
            example.setOrderByClause(info.getSort() + " " + info.getOrder());
        }
        MarketCouponUserExample.Criteria criteria = example.createCriteria();
        // 不为空，拼接上查询条件
        if (couponId != null && !"".equals(couponId)) {
            criteria.andCouponIdEqualTo(couponId);
        }
        if (userId != null && !"".equals(userId)) {
            criteria.andUserIdEqualTo(userId);
        }
        if (status != null && !"".equals(status)) {
            criteria.andStatusEqualTo(status);
        }
        // 查询前开启分页
        PageHelper.startPage(info.getPage(), info.getLimit());
        List<MarketCouponUser> marketCouponUsers = marketCouponUserMapper.selectByExample(example);
        // 查询结果交给分页工具处理
        PageInfo<MarketCouponUser> marketCouponUserPageInfo = new PageInfo<>(marketCouponUsers);
        CommonData data = CommonData.data(marketCouponUserPageInfo);
        return data;
    }
}